package main

import (
	"fmt"
	"reflect"
)

// 方法集合
// 方法集合决定了它是否实现某个接口
// 根据接收参数的不同，分为两个视角： T 和 *T
// T.set = T
// *T.set = T + *T

type T int

func (T) A()  {}
func (T) B()  {}
func (*T) C() {}
func (*T) D() {}

func show(i interface{}) {
	t := reflect.TypeOf(i)
	for i := 0; i < t.NumMethod(); i++ {
		fmt.Printf(t.Method(i).Name)
	}
	fmt.Println()
}

func main() {
	var n T = 1
	var p *T = &n
	show(n)
	show(p)
}
